package CutLoad
{
	import CutLoad.cookies.Painter;
	
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;

	/**
	 * swf文件模块基础类 .加载的swf模块（CutLoad.LoadModuleSwf（..）） 必须继承这个类
	 * 关于模块基础类生命过程：当cutload加载ModuleBase时设置当前模版的相应的保存的数据，ModuleBase.initData(..)，加载完成后会自动启动:ModuleBase.main(),切换新的模板文件会先调用当前模板的ModuleBase.killMe()
	 * @author smallerbird mail:smallerbird@gmail.com  site:www.mkigm.com QQ群:49983196
	 * 
	 */	
	public class ModuleBase extends MovieClip implements IBase
	{
		
		
		private var god:CutLoad=null;
		protected var isAddStage:Boolean=false;
		protected var myData:ModuleData;
		//清除自己时，调用的动画，播放完后，调用的方法
		private var fun_leaveMoviePlayEndDo:Function
		public function ModuleBase()
		{
			//
			this.addEventListener(Event.ADDED_TO_STAGE,init_super);
		}
		protected function init_super(e:Event):void{
			isAddStage=true;
			god=this.parent.parent as CutLoad;
			this.gotoAndPlay(1);
			CutLoad.CutLoad.debug("cutload 设置当前模块Event.ADDED_TO_STAGE时，gotoAndPlay(1)",2);
			main();
		}
		/**
		 * cutload加载完swf模块文件里调用的方法，这里会传入当前 swf模块文件保存的一些数据信息。建议不要重写这个方法来做为swf模块的初始化方法，请重写：ModuleBase.main(..)方法。
		 * @param data
		 * 
		 */		
		public function initData(data:ModuleData):void{
			this.myData=data;
		}
		/**
		 * swf模块文件初始化入口方法。注：当加载到场景中时调用的方法。通常覆盖这个方法做为初始化的入口
		 * 
		 */		
		public function main():void{
			
			var str:String=(" "+this.myData.url+":最好覆盖这个方法：ModuleBase.main()  swf模块文件初始化入口方法。注：当加载到场景中时调用的方法。通常覆盖这个方法做为初始化的入口")
			CutLoad.CutLoad.debug(str,2);
		}	
		/**
		 *  消除swf模块,每次cutload加载新的模版文件时，会调用这个方法。
		 * 
		 */		
		public function killMe():void{
			var str:String=(" "+this.myData.url+": 最好覆盖这个方法：ModuleBase.killMe()  清除swf模块时，会调用这个方法");
			CutLoad.CutLoad.debug(str,2);
		}
		/**
		 * 离开动画播放：当调用本类的leaveMovieStart时，会调用这个方法。需要覆盖这个方法，来自定义离开动画的一些代码。例如放完离开动画时，需要执行leaveMoviePlayEndDo;
		 * 
		 */		
		protected function leaveMovie():void{
			var str:String=(" "+this.myData.url+":  最好覆盖这个方法：ModuleBase.leaveMovie()  来自定义离开动画的一些代码。例如放完离开动画时，需要执行leaveMoviePlayEndDo;");
			CutLoad.CutLoad.debug(str,2);
			if(this.parent!=null) this.parent.removeChild(this);
		}
		/**
		 * 设置开始播放离开动画，同时设置离开动画放完时要执行的动作。注意： 离开动画放完时执行的动作，只执行一次，执行完后就清除了。
		 * @param fun_leaveMoviePlayEndDo
		 * 
		 */		
		public function leaveMovieStart(fun_leaveMoviePlayEndDo:Function):void{
			this.fun_leaveMoviePlayEndDo=fun_leaveMoviePlayEndDo;
			leaveMovie();
		}
		/**
		 * 设置宽高,当主画面改变时，cutload调用这个方法。
		 * @param w 宽
		 * @param h 高
		 * 
		 */		
		public function setWH(w:Number=0,h:Number=0):void{
			var str:String=(" "+this.myData.url+":  最好覆盖这个方法：ModuleBase.setWH()  设置宽高,当主画面改变时，cutload调用这个方法。");
			CutLoad.CutLoad.debug(str,2);
		}
		/**
		 * 执行 leaveMovieStart方法传入的参数方法。注该参数方法
		 * @return 
		 * 
		 */		
		public function leaveMoviePlayEndDo():Boolean{
			if(fun_leaveMoviePlayEndDo!=null){
				try{
					fun_leaveMoviePlayEndDo(this)
				}catch(e:ArgumentError){
					fun_leaveMoviePlayEndDo();
				}
				fun_leaveMoviePlayEndDo=null;
				return true;
			}
			return false;
		}
		/**
		 * 获得显示的宽度 
		 * @return 
		 * 
		 */		
		public function getShowWidth():Number
		{
			return this.width;
		}
		/**
		 * 获得显示的高度  
		 * @return 
		 * 
		 */		
		public function getShowHeight():Number
		{
			return this.height;
		}
		/**
		 * 获得当前模块保存的数据 
		 * @return 
		 * 
		 */		
		public function getModuleData():ModuleData{
			return this.myData;
		}
		/**
		 * 是否已加载到场景中
		 * @return 
		 * 
		 */		
		public function getIsAddStage():Boolean{
			return isAddStage;
		}
		/**
		 * 获得加载它的cutload实例 
		 * @return 
		 * 
		 */		
		public function getMain():CutLoad{
			return god;
		}
	}
}